package pers.cz.jwt;

import io.jsonwebtoken.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * token工具类
 * @program: PostGirl-panent
 * @description: JwtUtil
 * @author: Cheng Zhi
 * @create: 2021-04-14 10:45
 **/
public class JwtUtil {

    private static Logger logger = LoggerFactory.getLogger(JwtUtil.class);

    public static final String TOKEN_HEADER = "Authorization";
    public static final String TOKEN_PREFIX = "Bearer ";
    public static final String SECRET = "jwtsecret";
    public static final String ISS = "echisan"; // 签名

    private static final Long EXPIRATION = 60 * 60 * 3L; //过期时间3小时

    private static final String ROLE = "role";

    /**
     * 生成token
     * @param username 用户名
     * @param role 角色
     * @param isRememberMe 是否记住状态
     * @return
     */
    public static String createToken(String username, String role, boolean isRememberMe){
        Map map = new HashMap();
        map.put(ROLE, role);
        return Jwts.builder()
                .signWith(SignatureAlgorithm.HS512, SECRET) //指定加密算法设置签名使用的签名算法和签名使用的秘钥
                .setClaims(map)
                .setIssuer(ISS) // 设置签名
                .setSubject(username) // 代表这个JWT的主体，即它的所有人，这个是一个json格式的字符串，可以存放什么userid，roldid之类的，作为什么用户的唯一标志
                .setIssuedAt(new Date())  // jwt的签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION * 1000)) // 设置过期时间
                .compact(); // 压缩为 xxxxx.xxxxx.xxx 的jwt
    }

    /**
     * 获取token中的用户名
    * @param token
     * @return
     */
    public static String getUserName(String token){
        String username;
        try {
            username = getTokenBody(token).getSubject();
        } catch (Exception e){
            username = null;
        }
        return username;
    }

    /**
     * 获取token中的用户角色
     * @param token
     * @return
     */
    public static String getUserRole(String token){
        return (String) getTokenBody(token).get(ROLE);
    }

    /**
     * 获取token对象
     * @param token
     * @return
     */
    private static Claims getTokenBody(String token){
        Claims claims = null;
        try{
            claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody();
        } catch(Exception e){
            logger.error("get token error!", e);
        }
        return claims;
    }

    /**
     * 判断是否过期
     * @param token
     * @return
     */
    public static boolean isExpiration(String token){
        try{
            return getTokenBody(token).getExpiration().before(new Date());
        } catch(Exception e){
            logger.error("judge token is expiration or valid error!", e);
        }
        return true;
    }

    public static void main(String[] args) {
        //String token = createToken("chengzhi", "admin", false);
        //System.out.println(token);

        System.out.println(getUserName("eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjaGVuZ3poaSIsInJvbGUiOiJhZG1pbiIsImlzcyI6ImVjaGlzYW4iLCJleHAiOjE2MTgzNzk0OTUsImlhdCI6MTYxODM2ODY5NX0.LH0aXO7QTcH6jbIaTPj2bD9HHMWJgDoZvx7-A3ttDIJ0Y_vRTjOyuFPJq2df6WwmFn8bpTJtjvN9flXnTXIFgA"));
        System.out.println(getUserRole("eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjaGVuZ3poaSIsInJvbGUiOiJhZG1pbiIsImlzcyI6ImVjaGlzYW4iLCJleHAiOjE2MTgzNzk0OTUsImlhdCI6MTYxODM2ODY5NX0.LH0aXO7QTcH6jbIaTPj2bD9HHMWJgDoZvx7-A3ttDIJ0Y_vRTjOyuFPJq2df6WwmFn8bpTJtjvN9flXnTXIFgA"));
    }

}
